package park.model.role;
import java.io.Serializable;
import java.util.Collection;
import java.util.HashSet;

import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.EqualsBuilder;

import park.model.party.Pessoa;
import park.model.thing.Veiculo;
/**
 * @archetype role
 * @author gilberto
 * @since 22/04/2009
 */
public class Cliente implements Serializable {
	private static final long serialVersionUID = 1L;
	/*
	 * References Pessoa class. 
	 * Note: 
	 * 	- the real state of this realacionship is cdPessoa;
	 *  - the lookup data is pessoa 
	 */
	private Integer cdPessoa;
	private transient Pessoa pessoa;
	/*
	 * Cliente can have zero or more Veiculos 
	 */
	private Collection<Veiculo> veiculos = new HashSet<Veiculo>();
	private Integer diaPgto;
	
	public Cliente(){}
	public Cliente(Integer cdPessoa, Integer diaPgto){
		this.cdPessoa = cdPessoa;
		this.diaPgto = diaPgto;
	}
	public Cliente(Pessoa pessoa, Integer diaPgto){
		setPessoa(pessoa);
		this.diaPgto = diaPgto;
	}
	
	public Cliente(Pessoa pessoa, Integer diaPgto, Veiculo v){
		setPessoa(pessoa);
		addVeiculo(v);
		this.diaPgto = diaPgto;
	}
	public Integer getCdPessoa() {return cdPessoa;}
	public void setCdPessoa(Integer cdPessoa) {this.cdPessoa = cdPessoa;}	
	public Pessoa getPessoa() {return pessoa;}
	public void setPessoa(Pessoa pessoa) {
		this.pessoa = pessoa;
		this.cdPessoa = pessoa.getCdPessoa();
	}
	public void setVeiculos(Collection<Veiculo> veiculos) {this.veiculos = veiculos;}
	public Collection<Veiculo> getVeiculos() {return veiculos;}
	public void addVeiculo(Veiculo veiculo){veiculos.add(veiculo);}
	public Integer getDiaPgto() {return diaPgto;}
	public void setDiaPgto(Integer diaPgto) {this.diaPgto = diaPgto;}

	@Override
	public boolean equals(final Object other) {
		if (this == other)
			return true;
		if (!(other instanceof Cliente))
			return false;
		Cliente castOther = (Cliente) other;
		return new EqualsBuilder()
				.append(cdPessoa, castOther.cdPessoa)
				//.append(pessoa, castOther.pessoa)  transient field
				//.append(veiculos, castOther.veiculos)  collection field
				.append(diaPgto, castOther.diaPgto).isEquals();
	}

	@Override
	public int hashCode() {
		return new HashCodeBuilder()
				.append(cdPessoa)
				//.append(pessoa)  transient field
				//.append(veiculos)  collection field				
				.append(diaPgto)
				.toHashCode();
	}

	@Override
	public String toString() {
		return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
				.appendSuper(super.toString())
				.append("cdPessoa", cdPessoa)
				//.append("pessoa", pessoa) transient field
				//.append("veiculos", veiculos)  collection field
				.append("diaPgto", diaPgto).toString();
	}
}
